package basic

//类定义 --- 主构造器
class OOPDemo constructor(firstName: String) {
    // 主构造器
    init {
        println("FirstName is $firstName")
    }

    // 次构造器
    constructor(firstName: String, lastname: String) : this(firstName) {
        println("FirstName is $firstName  $lastname")
    }

    // 方法定义
    fun foo(): Unit {
        println("hello world")
    }

    // 属性定义
    val site: Int = 1

    // 访问权限修饰符
    private val pa: Int? = null
    protected val pra: Int? = null
    internal val ina: Int? = null

    // default
    public val pu: Int? = null

}

// base class use the open,override ,final(default)
open class Base {
    open fun f() {}
}

// abstract class
abstract class Derived : Base() {
    override abstract fun f()
}

// inner class
class Outer {
    private val bar: Int = 1
    var v = "成员属性"

    /**嵌套内部类**/
    inner class Inner {
        fun foo() = bar  // 访问外部类成员
        fun innerTest() {
            var o = this@Outer //获取外部类的成员变量
            println("内部类可以引用外部类的成员，例如：" + o.v)
        }
    }
}

// interface [default open can override]
interface MyInterface {
    fun bar()    // 未实现
    fun foo() {  //已实现
        // 可选的方法体
        println("foo")
    }

    //    接口中的属性只能是抽象的，不允许初始化值，接口不会保存属性值，实现接口时，必须重写属性：
    var name: String //name 属性, 抽象的

}

class Child : MyInterface {
    override fun bar() {
        // 方法体
    }

    override var name: String = "runoob" //重写属性

}